/*
 * Copyright 2013 University of Padua, Italy
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package it.dei.unipd.healthservice.database;

import it.dei.unipd.healthservice.resource.*;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;

/**
 * Aggiorna i dati di un ordine per un fornitore
 * @author Giorgio Vitale
 * @version 1.00
 */
public class UpdateOrdineFornituraDatabase {
	protected final String STATEMENT ="UPDATE ordinefornitura SET " +
					"dataordine=?, dataconsegna=?, stato=?::stato_ordine " +
					"WHERE idordinefornitura=? " +
					"ORDER BY dataordine desc, dataconsegna desc;";
	
	/**
	 * Connessione al database
	 */
	private final Connection con;

	/**
	 * Ordine da modificare
	 */
	private final OrdineFornitura ordine;
	
	/**
	 * Modifica l'ordine
	 * @param con
	 *            connessione al database.
	 * @param ordine ordine da modificare
	 */
	public UpdateOrdineFornituraDatabase(Connection con, OrdineFornitura ordine) {
		this.con = con;
		this.ordine = ordine;
	}

	/**
	 * Aggiorna i dati dell'ordine
	 * @throws SQLException
	 *             in caso di problemi nell'accesso al database.
	 */
	public void update() throws SQLException {
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			pstmt = con.prepareStatement(STATEMENT);
			if (ordine.getDataOrdine()!=null && ordine.getDataConsegna()!=null && 
					ordine.getDataOrdine().compareTo(ordine.getDataConsegna())>0)
				throw new SQLException("Errore! Data consegna antecedente data apertura ordine.");
			if (ordine.getDataOrdine()==null && ordine.getDataConsegna()!=null)
				throw new SQLException("Errore! Impostare una data di apertura prima della data di chiusura.");
			if (ordine.getStato()==StatoOrdine.CONSEGNATO && ordine.getDataConsegna()==null)
				throw new SQLException("Errore! Per consegnare un ordine occorre specificare una data di chiusura.");
			pstmt.setDate(1, ordine.getDataOrdine());
			pstmt.setDate(2, ordine.getDataConsegna());
			pstmt.setString(3, ordine.getStato().name());
			pstmt.setInt(4, ordine.getIdOrdineFornitura());
			pstmt.executeUpdate();
		}
		finally {
			if (rs != null)
				rs.close();
			if (pstmt != null)
				pstmt.close();
			con.close();
		}
	}
}
